SBS_03 程序的运行时视图

理解程序是如何在入内存并执行的,就能更容易地判断必须创建哪些目标文件、可执行文件和发布包。

1 可执行程序

可执行程序是一组指令的序列,这些指令被载入内存,由中央处理器执行。

调用方式

  • 通过窗口环境双击图标
  • 在命令行 shell 中输入程序名
  • 计算机开机启动时,程序被载入内存
  • 由调度工具在指定时间点启动程序

执行方式: 程序被载入内存之后,其执行方式可以采用几种方式,取决于程序载入之前完成了多大程度编译,以及程序需要操作系统提供多大程度的支持。从执行方式的角度可以分 4 类,下面分别介绍。

1.1 原生机器码

说明:完全是 CPU 的原生机器码。CPU 只需要跳到程序的起始点,然后所有的执行都完全通过 CPU 硬件来完成。执行过程中,程序偶尔会调用操作系统,来访问文件或其它系统资源。

机器代码程序与操作系统的交互

应用: 最常用于 c 或 c++ 类的语言。
优点: 能充分利用 CPU ,执行速度快。
构造系统的任务: 生成可执行程序文件。

1.2 单体系统镜像

说明: 有时使用解释器,但大多数嵌入式系统都使用原生机器码的执行方式,程序占用全部内存。从构造系统的角度来看,最终的发布包只是个大型文件,直接载入到计算机内存中。通常是载入计算机的唯一内容。

单体系统镜像,没有对机器实施控制的操作系统

应用: 嵌入式系统,操作系统通常更小型化甚至根本没有。
构造系统的任务: 为嵌入式系统编写软件,通常比为全功能操作系统编写软件更难。构造系统必须运行在以 LInux 或 Windows 为操作系统的构造服务器上。软件编译完成后,最终的发布包要传输到用来运行程序的嵌入式设备上。

1.3 程序完全解释执行

说明: 不编译成机器码,由运行时系统把整个源代码载入内存,并解释执行。

由解释器处理的源代码

应用: 早期的 BASIC,UNIX Shell 等
构造系统的任务: 把源文件汇集到发布包中,以便在目标机器上安装,常见的其它工作包括,生成单元测试文件、执行静态分析、生成文档等。
扩展: 有些解释性语言允许与编译型语言进行集成,将软件变成编译型代码和解释性代码的混合体。

1.4 解释型字节码

说明: 字节码(Byte codes)与原生机器码很相似,区别是 CPU 并不直接理解字节码。首先要把字节码全部转译成原生机器码,或在程序执行时一边解释一边执行。因此字节码需要额外的解释器或编译器,与程序一同载入内存。

运行前全部转译为字节码

Java 虚拟机,将字节码转译成原生机器码

应用:Java
构造系统的任务:构造系统调用编译器,创建机器无关的字节码文件,而非生成 CPU 的原生机器码。

运行时转译为字节码

Perl 或 Python 源代码在运行时转译成字节码

应用: Python、Perl
构造系统的任务: 把源文件汇集成发布包,供目标机器解释执行。这一过程没有明显的编译阶段,不过在运行时会自动转译为字节码。因此可以理解为部分构构造系统是嵌入在运行时环境中的。
特点: 优点是对源代码的修改可以在下次执行脚本时自动生效。缺点是代码中如有语法错误,只能等到程序执行时才能发现。

2 程序库

说明: 在许多编程语言中,可以把程序库视为标准语言的一种扩展,与自己编写的函数一样使用。当然,程序库也可以来自一些第三方甚至自己也可以为某种语言编写程序库提供给别人使用。事实上,大多数操作系统都预置了一组程序库,用于文件和网络 IO、数学函数、用户界面操控、数据库读写等操作。

构造系统与程序库
针对程序库,构造系统主要有两方面相关的工作:

  • 创建新程序库:首先编译待入库文件形成目标文件的集合,然后用特定的链接或归档操作把这些目标文件绑定到单个程序库文件,并为现有函数创建适当的索引。
  • 链接到程序库:在创建了某个可执行程序后,构造系统必须提供一套程序库检索列表。这样以来,如果源代码中引用了开发人员自己并没有编写的函数,则系统将搜索程序库列表,找到所需的函数后,将相应的目标文件复制到可执行程序中。

2.1 静态链接

说明: 当链接器工具判断当下需要某个函数时,它就从程序库中摘取合适的目标文件,并将其复制到可执行程序中。因此链接过程是一种构造时概念,而不是运行时情景,最终的可执行程序是单个可执行程序,可以随时载入到目标机器执行。

与程序库进行静态链接的可执行程序

2.2 动态链接

说明: 动态链接不把目标文件复制到可执行程序实体中,而是标明为了顺利执行该程序,需要哪些程序库。当以后在执行程序时,则将程序库作为单独实体载入到内存中,并通过动态链接器与之程序连接起来。

与程序库进行运行时动态链接的程序

特点: 相比静态链接更为复杂,但有点如下

  • 程序库升级不需要重新创建构建
  • 当多个程序使用同一份程序库时,操作系统秩序载入一份,优化了内存占用。

3 配置文件和数据文件

程序有时会需要一些外部数据源,程序可以在运行期间调用操作系统,将这些数据读入内存。这些数据的利用形式没有任何限制,比如:

  • 图像
  • 声音文件
  • 配置文件
  • 帮助文档
  • 数据库

相关构造过程: 除非可以通过 Internet 访问,否则需要把这些数据文件转换到程序的发布包中,以便安装到目标机器上。

4 分布式程序

说明: 多个程序相互通信可以像一个软件一样工作,可以运行在同一台设备上,也可以是多台设备,这就是分布式程序。

构造过程:构造并打包许多不同的可执行程序,配以必要的配置文件和启动脚本。

单个程序划分到两台物理机器,通过网络进行通信